package linearlist.impl;

import linearlist.Linearlist;

import java.lang.reflect.Array;

/**
 * 顺序表
 * Created by Administrator on 2017/3/2.
 */
public class SeqList<E> implements Linearlist<E> {
    /*数组*/
    private E[] data;
    /*数组长度*/
    private int size;
    /*数组最大长度*/
    private int maxsize;

    /*初始化*/
    public SeqList(Class<E> type, int maxsize) {
        data = (E[]) Array.newInstance(type, maxsize);
        size = 0;
        this.maxsize = maxsize;
    }

    /**
     * 末尾增加元素
     * @param e 元素
     * @return
     */
    @Override
    public boolean add(E e) {
        /*空间是否够用*/
        if (!isFull()) {
            data[size] = e;
            size++;
            return true;
        }
        return false;
    }

    /**
     * 判断是否为空
     * @return
     */
    private boolean isFull() {
        if (size == maxsize) {
            return true;
        }
        return false;
    }

    /**
     * 中间插入元素
     * @param e 元素
     * @param i 位置
     * @return
     */
    @Override
    public boolean add(E e, int i) {
        if (i < 0 || i > size) {
            throw new RuntimeException("无法插入数据");
        }
        if (!isFull()) {
            for (int j = size - 1; j > i; j--) {
                data[j + 1] = data[j];
            }
            data[i] = e;
            size++;
        }

        return false;
    }

    /**
     * 删除元素
     * @param i 位置
     * @return
     */
    @Override
    public E remove(int i) {
        check(i);
        if (!isEmpty()) {
            E oldValue = data[i];
            for (int j = i; j < size - 1; j++) {
                data[j] = data[j + 1];
            }
            data[--size] = null;
            return oldValue;
        }
        return null;
    }

    /**
     * 检查该位置是否存在
     * @param i 位置
     */
    private void check(int i) {
        if (i < 0 || i > size) {
            throw new RuntimeException("无法找到此数据");
        }
    }

    /**
     * 查找元素位置
     * @param e 元素
     * @return
     */
    @Override
    public int indexOf(E e) {
        if (e == null) {
            for (int i = 0; i < size; i++)
                if (data[i] == null)
                    return i;
        } else {
            for (int i = 0; i < size; i++) {
                if (e.equals(data[i]))
                    return i;
            }
        }
        return 0;
    }

    /**
     * 获取元素
     * @param i 位置
     * @return
     */
    @Override
    public E get(int i) {
        check(i);
        return data[i];
    }

    /**
     * 数组的元素长度
     * @return
     */
    @Override
    public int size() {
        return size;
    }

    /**
     * 清除元素
     */
    @Override
    public void clear() {
        for (int i = 0; i < size; i++) {
            data[i] = null;
            size = 0;
        }
    }

    /**
     * 判断数组是否为空
     * @return
     */
    @Override
    public boolean isEmpty() {
        return size == 0;
    }
}
